package com.ler.yrmall.coupon.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ler.yrmall.basic.Form;
import com.ler.yrmall.coupon.dto.CouponDTO;
import com.ler.yrmall.coupon.entity.CouponEntity;
import com.ler.yrmall.coupon.form.AvailableCouponForm;
import com.ler.yrmall.coupon.form.CouponForm;
import com.ler.yrmall.coupon.vo.CouponVO;

import java.math.BigDecimal;
import java.util.List;

/**
 * @author Leron
 */
public interface CouponService extends IService<CouponEntity> {

    /**
     * 分页
     * @param request
     * @return
     */
    IPage<CouponVO> find(Form request);

    /**
     * spu 关联的优惠券
     * @param spuId
     * @return
     */
    List<CouponEntity> spuCoupon(Long spuId);

    /**
     * 保存
     * @param request
     */
    void saveCoupon(CouponForm request);

    /**
     * 优惠券领取
     * @param couponId
     */
    void receive(long couponId);

    /**
     * 查询
     * @param id
     * @return
     */
    CouponVO get(Long id);

    /**
     * 获取当前登陆用户最优的优惠券
     * @param spuIdList
     * @param amount
     * @return
     */
    CouponDTO computeBestCoupon(List<Long> spuIdList, BigDecimal amount);

    /**
     * 用户优惠券
     * @param amount Can be null
     * @return
     */
    List<CouponEntity> getUserCoupon(BigDecimal amount);

    /**
     * 查询可用的优惠券列表
     * @param request
     * @return
     */
    List<CouponEntity> availableCoupon(AvailableCouponForm request);

    /**
     * 使用优惠券
     * @param couponId
     * @param amount
     * @return
     */
    CouponDTO useCoupon(Long couponId, BigDecimal amount);

    /**
     * 可用优惠券数量
     * @return
     */
    Long availableNum();
}

